#include "Socket.hpp"
#include "Common.hpp"
#include <iostream>
#include <string>
#include <memory>
#include"Protocol.hpp"
using namespace SocketModule;
void Usage(std::string proc)
{
    std::cerr << "Usage: " << proc << std::endl;
}

void GetDataFromStdin(int *x, int *y, char *oper)
{
    std::cout << "Enter x,y,oper: ";
    std::cin >> *x >> *y >> *oper;
}

//  ./tcpclient 127.0.0.1 8080
int main(int argc, char *argv[])
{
    if (argc != 3)
    {
        Usage(argv[0]);
        exit(USAGE_ERROR);
    }
    std::string server_ip = argv[1];
    uint16_t server_port = std::stoi(argv[2]); // 将端口字符串转整数

    std::shared_ptr<Socket> client = std::make_shared<TcpSocket>(); // 创建一个套接字对象
    client->BuildClientySocketMethod();                             // 初始化套接字

    if (client->Connect(server_ip, server_port) != 0) // 链接失败了
    {
        std::cerr << "Connect failed" << std::endl;
        exit(CONNECT_ERROR);
    }

    std::unique_ptr<Protocol> protocol = std::make_unique<Protocol>(); // 创建一个协议对象
    std::string resp_buffer; // 应答的缓冲区
    
    // 到这里就是链接服务器成功了
    while (true)
    {
        // 1、从标准输入中进行数据的获取操作
        int x, y;
        char oper;
        GetDataFromStdin(&x, &y, &oper);

        //2、构建一体个请求->可以直接发送的字符串
        std::string req_str = protocol->BuildRequestString(x, y, oper);
        std::cout<<"----------------encode req_str:-"<<std::endl;
        std::cout<<req_str<<std::endl;
        std::cout<<"------------------------------------------"<<std::endl;
        //3、发送请求---往_sockfd中写入message的内容
        client->Send(req_str);

        //4、获取应答
        Response resp;
        bool res=protocol->GetResponse(client,resp_buffer,&resp);//将应答报文反序列化到resp对象中
        if(res==false)
        {
            break;//要么客户端出错或者是退出了
        }
        //到这里就是读取成功了
        //5、显示结果
        resp.ShowResult();
    }
    client->Close(); // 关闭客户端
    return 0;
}